# -*- coding: utf-8 -*-
"""
@Time    : 2024/8/21 18:40 
@Author  : ZhangShenao 
@File    : 3.使用@tool装饰器自定义工具.py 
@Desc    : tool装饰器,创建自定义工具

借助LangChain提供的@tool装饰器,可以非常方便地将一个已有的函数转换成LLM的工具

默认情况下,@tool装饰器使用函数名作为tool_name
并且使用函数的文档字符串作为tool_description

可以通过@tool装饰器的参数来修改工具的属性

针对已经存在的函数,并且功能比较简单,可以使用@tool装饰器直接创建工具,非常方便
但是,@tool装饰器的问题是,不能针对一个函数同时创建同步和异步的工具,而是需要分别创建

"""
from langchain_core.tools import tool

from calculator_input import CalculatorInput


# 使用@tool装饰器,创建自定义工具
@tool(
    "multiply_tool",  # 指定工具名称
    return_direct=True,  # 直接返回结果
    args_schema=CalculatorInput  # 指定工具参数定义
)
def multiply(x: int, y: int) -> int:
    """
    计算两个整数的乘积
    :param x: 第一个整数
    :param y: 第二个整数
    :return: 两个数的乘积
    """
    return x * y


# 获取工具的属性信息
print(f"工具名称: {multiply.name}")
print(f"工具描述: {multiply.description}")
print(f"工具参数定义: {multiply.args}")
print(f"工具是否直接返回: {multiply.return_direct}")

# 调用工具,获取结果
result = multiply.invoke({"x": 3, "y": 4})
print(f"工具调用结果: {result}")
